# 1. 导入必备库（直接复制运行）
import pandas as pd
import numpy as np
import seaborn as sns
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans


# 2. 数据加载与基础查看
# 加载数据集
df = pd.read_csv("campus_secondhand.csv")
# 查看前5行数据
print("数据前5行：\n", df.head())
# 查看数据形状
print("数据形状（行数, 列数）：", df.shape)
# 转换日期格式
df["trade_date"] = pd.to_datetime(df["trade_date"])
# 打印数据类型，确认日期转换成功
print("转换后的数据类型：\n", df.dtypes)

# 3. 计算核心交易指标（直接套用模板）
# 设定基准日期（固定为2024-09-01）
benchmark_date = pd.to_datetime("2024-09-01")

# 按用户分组计算RFM-like指标
user_metrics = df.groupby("user_id").agg({
    "trade_date": lambda x: (benchmark_date - x.max()).days,  # R：最近交易距基准日天数
    "trade_amount": ["count", "sum"]  # F：交易次数，M：总交易金额
}).reset_index()

# 简化列名（避免多级列名麻烦）
user_metrics.columns = ["user_id", "R", "F", "M"]
print("核心交易指标前5行：\n", user_metrics.head())

# 4. 数据标准化
# 选择R、F、M列进行标准化
scaler = StandardScaler()
metrics_scaled = scaler.fit_transform(user_metrics[["R", "F", "M"]])
# 转换为DataFrame方便查看
metrics_scaled_df = pd.DataFrame(metrics_scaled, columns=["R_scaled", "F_scaled", "M_scaled"])
print("标准化后数据前5行：\n", metrics_scaled_df.head())

# 5. 肘方法选最优K值（固定K=4，只需完成绘图）
wcss = []  # 存储聚类内平方和
k_range = range(2, 6)  # K值范围[2,5]
for k in k_range:
    # 构建K均值模型（n_init=10避免警告）
    kmeans = KMeans(n_clusters=k, random_state=2025, n_init=10)
    kmeans.fit(metrics_scaled)
    wcss.append(kmeans.inertia_)  # 记录WCSS值


# 固定最优K值为4（无需学生判断，直接使用）
optimal_k = 4

# 6. K均值聚类
# 构建聚类模型
kmeans_model = KMeans(n_clusters=optimal_k, random_state=2025, n_init=10)
# 给原始指标数据添加聚类标签
user_metrics["cluster_label"] = kmeans_model.fit_predict(metrics_scaled)

# 统计各聚类用户数量及占比
cluster_count = user_metrics["cluster_label"].value_counts().reset_index()
cluster_count.columns = ["聚类标签", "用户数量"]
cluster_count["用户占比(%)"] = (cluster_count["用户数量"] / cluster_count["用户数量"].sum() * 100).round(2)
print("各聚类用户统计：\n", cluster_count)

# 8. 聚类结果分析
# 计算各聚类R、F、M均值
cluster_mean = user_metrics.groupby("cluster_label").agg({
    "R": "mean",
    "F": "mean",
    "M": "mean"
}).round(2)
cluster_mean.columns = ["平均最近交易天数", "平均交易频率", "平均总交易金额"]
print("各聚类指标均值：\n", cluster_mean)

# 用户分群命名（参考示例，学生可调整）
cluster_names = {
    0: "__________",  # 例：核心交易用户（R小、F大、M大）
    1: "__________",  # 例：潜力交易用户（R小、F小、M大）
    2: "__________",  # 例：普通交易用户（R中、F中、M中）
    3: "__________"   # 例：低频低消费用户（R大、F小、M小）
}
# 打印命名结果
for label, name in cluster_names.items():
    print(f"聚类{label}：{name}")

# 运营策略建议（各写1句）
print("核心交易用户运营建议：__________")  # 例：发放专属交易补贴，鼓励持续活跃
print("低频低消费用户运营建议：__________")  # 例：推送低价热门商品，吸引首次交易